package com.atguigu.gmall.product.service.impl;

import com.atguigu.gmall.product.entity.BaseAttrValue;
import com.atguigu.gmall.product.service.BaseAttrValueService;
import com.atguigu.gmall.product.vo.SaveAttrInfoVO;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.product.entity.BaseAttrInfo;
import com.atguigu.gmall.product.service.BaseAttrInfoService;
import com.atguigu.gmall.product.mapper.BaseAttrInfoMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

/**
* @author vvx
* @description 针对表【base_attr_info(属性表)】的数据库操作Service实现
* @createDate 2023-08-15 18:49:15
*/
@Service
public class BaseAttrInfoServiceImpl extends ServiceImpl<BaseAttrInfoMapper, BaseAttrInfo>
    implements BaseAttrInfoService {

    @Autowired
    BaseAttrValueService baseAttrValueService;

    @Override
    public List<BaseAttrInfo> attrInfoList(Long c1id, Long c2id, Long c3id) {
        return baseMapper.getAttrInfoList(c1id, c2id, c3id);
    }

  /*
  保存前端提交的json，由两部分构成
  {
  表一
  "id": null,
    "attrName": "hhh",
    "categoryId": 61,
    "categoryLevel": 3

  表二
    "attrValueList": [{
        "valueName": "hhh",
        "edit": false
    }]
   }
  */
//    操作了两张表，要使用事务
//    事务的开启，需要事务项目和启动类上都要添加注解
    @Transactional
    @Override
    public void saveAttrInfo(SaveAttrInfoVO saveAttrInfoVO) {

//        保存上半部分 BaseAttrInfo表
        BaseAttrInfo baseAttrInfo = new BaseAttrInfo();
//        属性对拷  entity和vo的属性名一模一样
        BeanUtils.copyProperties(saveAttrInfoVO, baseAttrInfo);
//        保存上半表
        save(baseAttrInfo);

//        保存自增id，数据库会自动生成的
//        为了后来的value表的封装,要单独出来
        Long id = baseAttrInfo.getId();

        List<BaseAttrValue> attrValues = saveAttrInfoVO.getAttrValueList()
                .stream()
                .map(item -> {
                    BaseAttrValue baseAttrValue = new BaseAttrValue();
                    baseAttrValue.setAttrId(id);
                    baseAttrValue.setValueName(item.getValueName());
                    return baseAttrValue;
                }).collect(Collectors.toList());

//        批量保存
        baseAttrValueService.saveBatch(attrValues);
    }

    @Override
    public void updateAttrInfo(SaveAttrInfoVO vo) {

//        修改属性表的内容
        lambdaUpdate()
                .set(BaseAttrInfo::getAttrName, vo.getAttrName())
                .set(BaseAttrInfo::getCategoryId, vo.getCategoryId())
                .set(BaseAttrInfo::getCategoryLevel, vo.getCategoryLevel())
                .eq(BaseAttrInfo::getId, vo.getId())
                .update();


//        修改属性值表的内容
        /*
        * 1. 先做差集计算， 数据库中存在，但是vo中不存在的数据删除
        * 2. 数据库和vo都存在，修改
        * 3. 数据库不存在，vo存在， 新增
        * */

//        1. 收集前端带来的id, 就是id不为空的部分
        List<Long> valueIds = vo.getAttrValueList().stream()
//                为什么lambda表达式不能加{}
                .filter(item ->
                        item.getId() != null
                )
                .map(item -> item.getId())
                .collect(Collectors.toList());

//        2. 删除前端没有，但是输出库中存在的
        if (valueIds != null && valueIds.size() > 0) {
            baseAttrValueService.lambdaUpdate()
                    .notIn(BaseAttrValue::getId, valueIds)
                    .eq(BaseAttrValue::getAttrId, vo.getId())
                    .remove();
        } else {
//            valueIds全是null，则说明这些属性都要删掉
            baseAttrValueService.lambdaUpdate()
                    .eq(BaseAttrValue::getAttrId, vo.getId())
                    .remove();
        }

//        新增或者修改
        vo.getAttrValueList().stream()
                .forEach(item -> {

//                    如果vo中的id为null，则说明是新增
                    if (item.getId() == null) {
                        BaseAttrValue attrValue = new BaseAttrValue();
                        attrValue.setValueName(item.getValueName());
                        attrValue.setAttrId(vo.getId()  );

//                        attrValue.setValueName(item.getValueName());
//                        attrValue.setAttrId();
                        baseAttrValueService.save(attrValue);
                    }else {
                        baseAttrValueService.lambdaUpdate()
//                                设置要更新的字段及值
                                .set(BaseAttrValue::getValueName, item.getValueName())
                                .eq(BaseAttrValue::getId, item.getId())
                                .update();
                    }
                });
    }
}




